{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0e088c79",
   "metadata": {},
   "source": [
    "### 代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8525d982",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入必要的库\n",
    "import torch\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import torch.nn as nn\n",
    "from torch.utils.data import DataLoader, TensorDataset # 用于构造数据加载器\n",
    "from torch.utils.data import random_split # 用于划分数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "561d9d3b",
   "metadata": {},
   "source": [
    "### 数据生成"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "473c2300",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义函数\n",
    "def f(x, y):\n",
    "    return x ** 2 + 2 * y ** 2\n",
    "\n",
    "# 定义初始值\n",
    "num_samples = 1000 # 1000个样本点\n",
    "X = torch.rand(num_samples) # 均匀分布\n",
    "Y = torch.rand(num_samples) # 均匀分布\n",
    "Z = f(X,Y) + 3 * torch.randn(num_samples)\n",
    "\n",
    "dataset = torch.stack([X, Y, Z], dim = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ceb63df5",
   "metadata": {},
   "source": [
    "### 数据划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "60aa88a4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 按照7：3划分数据集\n",
    "train_size = int(0.7 * len(dataset))\n",
    "test_size = len(dataset) - train_size\n",
    "\n",
    "train_dataset, test_dataset = random_split(dataset=dataset, lengths=[train_size, test_size])\n",
    "\n",
    "# 将数据封装成数据加载器\n",
    "train_dataloader = DataLoader(TensorDataset(train_dataset.dataset.narrow(1,0,2), train_dataset.dataset.narrow(1,2,1)), batch_size=32)\n",
    "test_dataloader = DataLoader(TensorDataset(test_dataset.dataset.narrow(1,0,2), test_dataset.dataset.narrow(1,2,1)), batch_size=32)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c0f1eb2f",
   "metadata": {},
   "source": [
    "### 模型定义"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "22b4f3d5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义一个简单模型\n",
    "class Model(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.hidden = nn.Linear(2, 8)\n",
    "        self.output = nn.Linear(8, 1)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = torch.relu(self.hidden(x))\n",
    "        return self.output(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "598859d3",
   "metadata": {},
   "source": [
    "### 模型训练对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8da7a204",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 超参数\n",
    "num_epochs = 100\n",
    "learning_rate = 0.1 # 学习率，故意调大一些更直观\n",
    "\n",
    "# 定义损失函数\n",
    "loss_fn = nn.MSELoss()\n",
    "\n",
    "# 通过一个训练对比有无学习率调节器的效果\n",
    "for with_scheduler in [False, True]:\n",
    "\n",
    "    # 定义训练和测试误差数组\n",
    "    train_losses = []\n",
    "    test_losses = []\n",
    "\n",
    "    # 初始化模型\n",
    "    model = Model()\n",
    "\n",
    "    # 定义优化器\n",
    "    optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)\n",
    "\n",
    "    # 定义学习率调节器\n",
    "    scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)\n",
    "\n",
    "    # 迭代训练\n",
    "    for epoch in range(num_epochs):\n",
    "        # 在训练数据上迭代\n",
    "        model.train()\n",
    "        train_loss = 0\n",
    "        # 遍历训练集\n",
    "        for inputs, targets in train_dataloader:\n",
    "            # 预测、损失函数、反向传播\n",
    "            optimizer.zero_grad()\n",
    "            outputs = model(inputs)\n",
    "            loss = loss_fn(outputs, targets)\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "            # 记录loss\n",
    "            train_loss += loss.item()\n",
    "\n",
    "        # 计算loss并记录到训练误差\n",
    "        train_loss /= len(train_dataloader)\n",
    "        train_losses.append(train_loss)\n",
    "\n",
    "        # 在测试数据上评估，测试模型不计算梯度\n",
    "        model.eval()\n",
    "        test_loss = 0\n",
    "        with torch.no_grad():\n",
    "            # 遍历测试集\n",
    "            for inputs, targets in test_dataloader:\n",
    "                # 预测、损失函数\n",
    "                outputs = model(inputs)\n",
    "                loss = loss_fn(outputs, targets)\n",
    "                # 记录loss\n",
    "                test_loss += loss.item()\n",
    "\n",
    "            # 计算loss并记录到测试误差\n",
    "            test_loss /= len(test_dataloader)\n",
    "            test_losses.append(test_loss)\n",
    "\n",
    "        # 是否更新学习率\n",
    "        if with_scheduler:\n",
    "            scheduler.step()\n",
    "    \n",
    "    # 绘制训练和测试误差曲线\n",
    "    plt.figure(figsize=(8, 4))\n",
    "    plt.plot(range(num_epochs), train_losses, label=\"Train\")\n",
    "    plt.plot(range(num_epochs), test_losses, label=\"Test\")\n",
    "    plt.title(\"{0} lr_scheduler\".format(\"With\" if with_scheduler else \"Without\"))\n",
    "    plt.legend()\n",
    "#     plt.ylim((1, 2))\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08e5cc41",
   "metadata": {},
   "source": [
    "### 常见学习率调节器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8fc183ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 学习率衰减，例如每训练100次就将学习率降低为原来的一半\n",
    "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "447bab70",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 指数衰减法，每次迭代将学习率乘上一个衰减率\n",
    "scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0bc65900",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 余弦学习率调节，optimizer初始学习率为最大学习率，eta_min是最小学习率，T_max是最大迭代次数\n",
    "scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100, eta_min=0.00001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2d5dbb4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 自定义学习率，通过一个lambda函数实现自定义的学习率调节器\n",
    "scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda epoch: 0.99 ** epoch)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d3422b39",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 预热\n",
    "warmup_steps = 20\n",
    "scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda t: min(t / warmup_steps, 0.001))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
